home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / rdma / ib_sa.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  13.9 KB  |  383 lines

  1. /*
  2.  * Copyright (c) 2004 Topspin Communications.  All rights reserved.
  3.  * Copyright (c) 2005 Voltaire, Inc.  All rights reserved.
  4.  * Copyright (c) 2006 Intel Corporation.  All rights reserved.
  5.  *
  6.  * This software is available to you under a choice of one of two
  7.  * licenses.  You may choose to be licensed under the terms of the GNU
  8.  * General Public License (GPL) Version 2, available from the file
  9.  * COPYING in the main directory of this source tree, or the
  10.  * OpenIB.org BSD license below:
  11.  *
  12.  *     Redistribution and use in source and binary forms, with or
  13.  *     without modification, are permitted provided that the following
  14.  *     conditions are met:
  15.  *
  16.  *      - Redistributions of source code must retain the above
  17.  *        copyright notice, this list of conditions and the following
  18.  *        disclaimer.
  19.  *
  20.  *      - Redistributions in binary form must reproduce the above
  21.  *        copyright notice, this list of conditions and the following
  22.  *        disclaimer in the documentation and/or other materials
  23.  *        provided with the distribution.
  24.  *
  25.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  26.  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  27.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  28.  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  29.  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  30.  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  31.  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  32.  * SOFTWARE.
  33.  */
  34.  
  35. #ifndef IB_SA_H
  36. #define IB_SA_H
  37.  
  38. #include <linux/completion.h>
  39. #include <linux/compiler.h>
  40.  
  41. #include <asm/atomic.h>
  42.  
  43. #include <rdma/ib_verbs.h>
  44. #include <rdma/ib_mad.h>
  45.  
  46. enum {
  47.     IB_SA_CLASS_VERSION        = 2,    /* IB spec version 1.1/1.2 */
  48.  
  49.     IB_SA_METHOD_GET_TABLE        = 0x12,
  50.     IB_SA_METHOD_GET_TABLE_RESP    = 0x92,
  51.     IB_SA_METHOD_DELETE        = 0x15,
  52.     IB_SA_METHOD_DELETE_RESP    = 0x95,
  53.     IB_SA_METHOD_GET_MULTI        = 0x14,
  54.     IB_SA_METHOD_GET_MULTI_RESP    = 0x94,
  55.     IB_SA_METHOD_GET_TRACE_TBL    = 0x13
  56. };
  57.  
  58. enum {
  59.     IB_SA_ATTR_CLASS_PORTINFO    = 0x01,
  60.     IB_SA_ATTR_NOTICE         = 0x02,
  61.     IB_SA_ATTR_INFORM_INFO         = 0x03,
  62.     IB_SA_ATTR_NODE_REC         = 0x11,
  63.     IB_SA_ATTR_PORT_INFO_REC     = 0x12,
  64.     IB_SA_ATTR_SL2VL_REC         = 0x13,
  65.     IB_SA_ATTR_SWITCH_REC         = 0x14,
  66.     IB_SA_ATTR_LINEAR_FDB_REC    = 0x15,
  67.     IB_SA_ATTR_RANDOM_FDB_REC    = 0x16,
  68.     IB_SA_ATTR_MCAST_FDB_REC     = 0x17,
  69.     IB_SA_ATTR_SM_INFO_REC         = 0x18,
  70.     IB_SA_ATTR_LINK_REC         = 0x20,
  71.     IB_SA_ATTR_GUID_INFO_REC     = 0x30,
  72.     IB_SA_ATTR_SERVICE_REC         = 0x31,
  73.     IB_SA_ATTR_PARTITION_REC     = 0x33,
  74.     IB_SA_ATTR_PATH_REC         = 0x35,
  75.     IB_SA_ATTR_VL_ARB_REC         = 0x36,
  76.     IB_SA_ATTR_MC_MEMBER_REC     = 0x38,
  77.     IB_SA_ATTR_TRACE_REC         = 0x39,
  78.     IB_SA_ATTR_MULTI_PATH_REC    = 0x3a,
  79.     IB_SA_ATTR_SERVICE_ASSOC_REC = 0x3b,
  80.     IB_SA_ATTR_INFORM_INFO_REC   = 0xf3
  81. };
  82.  
  83. enum ib_sa_selector {
  84.     IB_SA_GT   = 0,
  85.     IB_SA_LT   = 1,
  86.     IB_SA_EQ   = 2,
  87.     /*
  88.      * The meaning of "best" depends on the attribute: for
  89.      * example, for MTU best will return the largest available
  90.      * MTU, while for packet life time, best will return the
  91.      * smallest available life time.
  92.      */
  93.     IB_SA_BEST = 3
  94. };
  95.  
  96. /*
  97.  * Structures for SA records are named "struct ib_sa_xxx_rec."  No
  98.  * attempt is made to pack structures to match the physical layout of
  99.  * SA records in SA MADs; all packing and unpacking is handled by the
  100.  * SA query code.
  101.  *
  102.  * For a record with structure ib_sa_xxx_rec, the naming convention
  103.  * for the component mask value for field yyy is IB_SA_XXX_REC_YYY (we
  104.  * never use different abbreviations or otherwise change the spelling
  105.  * of xxx/yyy between ib_sa_xxx_rec.yyy and IB_SA_XXX_REC_YYY).
  106.  *
  107.  * Reserved rows are indicated with comments to help maintainability.
  108.  */
  109.  
  110. #define IB_SA_PATH_REC_SERVICE_ID               (IB_SA_COMP_MASK( 0) |\
  111.                             IB_SA_COMP_MASK( 1))
  112. #define IB_SA_PATH_REC_DGID                IB_SA_COMP_MASK( 2)
  113. #define IB_SA_PATH_REC_SGID                IB_SA_COMP_MASK( 3)
  114. #define IB_SA_PATH_REC_DLID                IB_SA_COMP_MASK( 4)
  115. #define IB_SA_PATH_REC_SLID                IB_SA_COMP_MASK( 5)
  116. #define IB_SA_PATH_REC_RAW_TRAFFIC            IB_SA_COMP_MASK( 6)
  117. /* reserved:                                 7 */
  118. #define IB_SA_PATH_REC_FLOW_LABEL               IB_SA_COMP_MASK( 8)
  119. #define IB_SA_PATH_REC_HOP_LIMIT            IB_SA_COMP_MASK( 9)
  120. #define IB_SA_PATH_REC_TRAFFIC_CLASS            IB_SA_COMP_MASK(10)
  121. #define IB_SA_PATH_REC_REVERSIBLE            IB_SA_COMP_MASK(11)
  122. #define IB_SA_PATH_REC_NUMB_PATH            IB_SA_COMP_MASK(12)
  123. #define IB_SA_PATH_REC_PKEY                IB_SA_COMP_MASK(13)
  124. #define IB_SA_PATH_REC_QOS_CLASS            IB_SA_COMP_MASK(14)
  125. #define IB_SA_PATH_REC_SL                IB_SA_COMP_MASK(15)
  126. #define IB_SA_PATH_REC_MTU_SELECTOR            IB_SA_COMP_MASK(16)
  127. #define IB_SA_PATH_REC_MTU                IB_SA_COMP_MASK(17)
  128. #define IB_SA_PATH_REC_RATE_SELECTOR            IB_SA_COMP_MASK(18)
  129. #define IB_SA_PATH_REC_RATE                IB_SA_COMP_MASK(19)
  130. #define IB_SA_PATH_REC_PACKET_LIFE_TIME_SELECTOR    IB_SA_COMP_MASK(20)
  131. #define IB_SA_PATH_REC_PACKET_LIFE_TIME            IB_SA_COMP_MASK(21)
  132. #define IB_SA_PATH_REC_PREFERENCE            IB_SA_COMP_MASK(22)
  133.  
  134. struct ib_sa_path_rec {
  135.     __be64       service_id;
  136.     union ib_gid dgid;
  137.     union ib_gid sgid;
  138.     __be16       dlid;
  139.     __be16       slid;
  140.     int          raw_traffic;
  141.     /* reserved */
  142.     __be32       flow_label;
  143.     u8           hop_limit;
  144.     u8           traffic_class;
  145.     int          reversible;
  146.     u8           numb_path;
  147.     __be16       pkey;
  148.     __be16       qos_class;
  149.     u8           sl;
  150.     u8           mtu_selector;
  151.     u8           mtu;
  152.     u8           rate_selector;
  153.     u8           rate;
  154.     u8           packet_life_time_selector;
  155.     u8           packet_life_time;
  156.     u8           preference;
  157. };
  158.  
  159. #define IB_SA_MCMEMBER_REC_MGID                IB_SA_COMP_MASK( 0)
  160. #define IB_SA_MCMEMBER_REC_PORT_GID            IB_SA_COMP_MASK( 1)
  161. #define IB_SA_MCMEMBER_REC_QKEY                IB_SA_COMP_MASK( 2)
  162. #define IB_SA_MCMEMBER_REC_MLID                IB_SA_COMP_MASK( 3)
  163. #define IB_SA_MCMEMBER_REC_MTU_SELECTOR            IB_SA_COMP_MASK( 4)
  164. #define IB_SA_MCMEMBER_REC_MTU                IB_SA_COMP_MASK( 5)
  165. #define IB_SA_MCMEMBER_REC_TRAFFIC_CLASS        IB_SA_COMP_MASK( 6)
  166. #define IB_SA_MCMEMBER_REC_PKEY                IB_SA_COMP_MASK( 7)
  167. #define IB_SA_MCMEMBER_REC_RATE_SELECTOR        IB_SA_COMP_MASK( 8)
  168. #define IB_SA_MCMEMBER_REC_RATE                IB_SA_COMP_MASK( 9)
  169. #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME_SELECTOR    IB_SA_COMP_MASK(10)
  170. #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME        IB_SA_COMP_MASK(11)
  171. #define IB_SA_MCMEMBER_REC_SL                IB_SA_COMP_MASK(12)
  172. #define IB_SA_MCMEMBER_REC_FLOW_LABEL            IB_SA_COMP_MASK(13)
  173. #define IB_SA_MCMEMBER_REC_HOP_LIMIT            IB_SA_COMP_MASK(14)
  174. #define IB_SA_MCMEMBER_REC_SCOPE            IB_SA_COMP_MASK(15)
  175. #define IB_SA_MCMEMBER_REC_JOIN_STATE            IB_SA_COMP_MASK(16)
  176. #define IB_SA_MCMEMBER_REC_PROXY_JOIN            IB_SA_COMP_MASK(17)
  177.  
  178. struct ib_sa_mcmember_rec {
  179.     union ib_gid mgid;
  180.     union ib_gid port_gid;
  181.     __be32       qkey;
  182.     __be16       mlid;
  183.     u8           mtu_selector;
  184.     u8           mtu;
  185.     u8           traffic_class;
  186.     __be16       pkey;
  187.     u8          rate_selector;
  188.     u8          rate;
  189.     u8          packet_life_time_selector;
  190.     u8          packet_life_time;
  191.     u8           sl;
  192.     __be32       flow_label;
  193.     u8           hop_limit;
  194.     u8           scope;
  195.     u8           join_state;
  196.     int          proxy_join;
  197. };
  198.  
  199. /* Service Record Component Mask Sec 15.2.5.14 Ver 1.1    */
  200. #define IB_SA_SERVICE_REC_SERVICE_ID            IB_SA_COMP_MASK( 0)
  201. #define IB_SA_SERVICE_REC_SERVICE_GID            IB_SA_COMP_MASK( 1)
  202. #define IB_SA_SERVICE_REC_SERVICE_PKEY            IB_SA_COMP_MASK( 2)
  203. /* reserved:                                 3 */
  204. #define IB_SA_SERVICE_REC_SERVICE_LEASE            IB_SA_COMP_MASK( 4)
  205. #define IB_SA_SERVICE_REC_SERVICE_KEY            IB_SA_COMP_MASK( 5)
  206. #define IB_SA_SERVICE_REC_SERVICE_NAME            IB_SA_COMP_MASK( 6)
  207. #define IB_SA_SERVICE_REC_SERVICE_DATA8_0        IB_SA_COMP_MASK( 7)
  208. #define IB_SA_SERVICE_REC_SERVICE_DATA8_1        IB_SA_COMP_MASK( 8)
  209. #define IB_SA_SERVICE_REC_SERVICE_DATA8_2        IB_SA_COMP_MASK( 9)
  210. #define IB_SA_SERVICE_REC_SERVICE_DATA8_3        IB_SA_COMP_MASK(10)
  211. #define IB_SA_SERVICE_REC_SERVICE_DATA8_4        IB_SA_COMP_MASK(11)
  212. #define IB_SA_SERVICE_REC_SERVICE_DATA8_5        IB_SA_COMP_MASK(12)
  213. #define IB_SA_SERVICE_REC_SERVICE_DATA8_6        IB_SA_COMP_MASK(13)
  214. #define IB_SA_SERVICE_REC_SERVICE_DATA8_7        IB_SA_COMP_MASK(14)
  215. #define IB_SA_SERVICE_REC_SERVICE_DATA8_8        IB_SA_COMP_MASK(15)
  216. #define IB_SA_SERVICE_REC_SERVICE_DATA8_9        IB_SA_COMP_MASK(16)
  217. #define IB_SA_SERVICE_REC_SERVICE_DATA8_10        IB_SA_COMP_MASK(17)
  218. #define IB_SA_SERVICE_REC_SERVICE_DATA8_11        IB_SA_COMP_MASK(18)
  219. #define IB_SA_SERVICE_REC_SERVICE_DATA8_12        IB_SA_COMP_MASK(19)
  220. #define IB_SA_SERVICE_REC_SERVICE_DATA8_13        IB_SA_COMP_MASK(20)
  221. #define IB_SA_SERVICE_REC_SERVICE_DATA8_14        IB_SA_COMP_MASK(21)
  222. #define IB_SA_SERVICE_REC_SERVICE_DATA8_15        IB_SA_COMP_MASK(22)
  223. #define IB_SA_SERVICE_REC_SERVICE_DATA16_0        IB_SA_COMP_MASK(23)
  224. #define IB_SA_SERVICE_REC_SERVICE_DATA16_1        IB_SA_COMP_MASK(24)
  225. #define IB_SA_SERVICE_REC_SERVICE_DATA16_2        IB_SA_COMP_MASK(25)
  226. #define IB_SA_SERVICE_REC_SERVICE_DATA16_3        IB_SA_COMP_MASK(26)
  227. #define IB_SA_SERVICE_REC_SERVICE_DATA16_4        IB_SA_COMP_MASK(27)
  228. #define IB_SA_SERVICE_REC_SERVICE_DATA16_5        IB_SA_COMP_MASK(28)
  229. #define IB_SA_SERVICE_REC_SERVICE_DATA16_6        IB_SA_COMP_MASK(29)
  230. #define IB_SA_SERVICE_REC_SERVICE_DATA16_7        IB_SA_COMP_MASK(30)
  231. #define IB_SA_SERVICE_REC_SERVICE_DATA32_0        IB_SA_COMP_MASK(31)
  232. #define IB_SA_SERVICE_REC_SERVICE_DATA32_1        IB_SA_COMP_MASK(32)
  233. #define IB_SA_SERVICE_REC_SERVICE_DATA32_2        IB_SA_COMP_MASK(33)
  234. #define IB_SA_SERVICE_REC_SERVICE_DATA32_3        IB_SA_COMP_MASK(34)
  235. #define IB_SA_SERVICE_REC_SERVICE_DATA64_0        IB_SA_COMP_MASK(35)
  236. #define IB_SA_SERVICE_REC_SERVICE_DATA64_1        IB_SA_COMP_MASK(36)
  237.  
  238. #define IB_DEFAULT_SERVICE_LEASE     0xFFFFFFFF
  239.  
  240. struct ib_sa_service_rec {
  241.     u64        id;
  242.     union ib_gid    gid;
  243.     __be16         pkey;
  244.     /* reserved */
  245.     u32        lease;
  246.     u8        key[16];
  247.     u8        name[64];
  248.     u8        data8[16];
  249.     u16        data16[8];
  250.     u32        data32[4];
  251.     u64        data64[2];
  252. };
  253.  
  254. struct ib_sa_client {
  255.     atomic_t users;
  256.     struct completion comp;
  257. };
  258.  
  259. /**
  260.  * ib_sa_register_client - Register an SA client.
  261.  */
  262. void ib_sa_register_client(struct ib_sa_client *client);
  263.  
  264. /**
  265.  * ib_sa_unregister_client - Deregister an SA client.
  266.  * @client: Client object to deregister.
  267.  */
  268. void ib_sa_unregister_client(struct ib_sa_client *client);
  269.  
  270. struct ib_sa_query;
  271.  
  272. void ib_sa_cancel_query(int id, struct ib_sa_query *query);
  273.  
  274. int ib_sa_path_rec_get(struct ib_sa_client *client,
  275.                struct ib_device *device, u8 port_num,
  276.                struct ib_sa_path_rec *rec,
  277.                ib_sa_comp_mask comp_mask,
  278.                int timeout_ms, gfp_t gfp_mask,
  279.                void (*callback)(int status,
  280.                     struct ib_sa_path_rec *resp,
  281.                     void *context),
  282.                void *context,
  283.                struct ib_sa_query **query);
  284.  
  285. int ib_sa_service_rec_query(struct ib_sa_client *client,
  286.              struct ib_device *device, u8 port_num,
  287.              u8 method,
  288.              struct ib_sa_service_rec *rec,
  289.              ib_sa_comp_mask comp_mask,
  290.              int timeout_ms, gfp_t gfp_mask,
  291.              void (*callback)(int status,
  292.                       struct ib_sa_service_rec *resp,
  293.                       void *context),
  294.              void *context,
  295.              struct ib_sa_query **sa_query);
  296.  
  297. struct ib_sa_multicast {
  298.     struct ib_sa_mcmember_rec rec;
  299.     ib_sa_comp_mask        comp_mask;
  300.     int            (*callback)(int status,
  301.                         struct ib_sa_multicast *multicast);
  302.     void            *context;
  303. };
  304.  
  305. /**
  306.  * ib_sa_join_multicast - Initiates a join request to the specified multicast
  307.  *   group.
  308.  * @client: SA client
  309.  * @device: Device associated with the multicast group.
  310.  * @port_num: Port on the specified device to associate with the multicast
  311.  *   group.
  312.  * @rec: SA multicast member record specifying group attributes.
  313.  * @comp_mask: Component mask indicating which group attributes of %rec are
  314.  *   valid.
  315.  * @gfp_mask: GFP mask for memory allocations.
  316.  * @callback: User callback invoked once the join operation completes.
  317.  * @context: User specified context stored with the ib_sa_multicast structure.
  318.  *
  319.  * This call initiates a multicast join request with the SA for the specified
  320.  * multicast group.  If the join operation is started successfully, it returns
  321.  * an ib_sa_multicast structure that is used to track the multicast operation.
  322.  * Users must free this structure by calling ib_free_multicast, even if the
  323.  * join operation later fails.  (The callback status is non-zero.)
  324.  *
  325.  * If the join operation fails; status will be non-zero, with the following
  326.  * failures possible:
  327.  * -ETIMEDOUT: The request timed out.
  328.  * -EIO: An error occurred sending the query.
  329.  * -EINVAL: The MCMemberRecord values differed from the existing group's.
  330.  * -ENETRESET: Indicates that an fatal error has occurred on the multicast
  331.  *   group, and the user must rejoin the group to continue using it.
  332.  */
  333. struct ib_sa_multicast *ib_sa_join_multicast(struct ib_sa_client *client,
  334.                          struct ib_device *device, u8 port_num,
  335.                          struct ib_sa_mcmember_rec *rec,
  336.                          ib_sa_comp_mask comp_mask, gfp_t gfp_mask,
  337.                          int (*callback)(int status,
  338.                                  struct ib_sa_multicast
  339.                                     *multicast),
  340.                          void *context);
  341.  
  342. /**
  343.  * ib_free_multicast - Frees the multicast tracking structure, and releases
  344.  *    any reference on the multicast group.
  345.  * @multicast: Multicast tracking structure allocated by ib_join_multicast.
  346.  *
  347.  * This call blocks until the multicast identifier is destroyed.  It may
  348.  * not be called from within the multicast callback; however, returning a non-
  349.  * zero value from the callback will result in destroying the multicast
  350.  * tracking structure.
  351.  */
  352. void ib_sa_free_multicast(struct ib_sa_multicast *multicast);
  353.  
  354. /**
  355.  * ib_get_mcmember_rec - Looks up a multicast member record by its MGID and
  356.  *   returns it if found.
  357.  * @device: Device associated with the multicast group.
  358.  * @port_num: Port on the specified device to associate with the multicast
  359.  *   group.
  360.  * @mgid: MGID of multicast group.
  361.  * @rec: Location to copy SA multicast member record.
  362.  */
  363. int ib_sa_get_mcmember_rec(struct ib_device *device, u8 port_num,
  364.                union ib_gid *mgid, struct ib_sa_mcmember_rec *rec);
  365.  
  366. /**
  367.  * ib_init_ah_from_mcmember - Initialize address handle attributes based on
  368.  * an SA multicast member record.
  369.  */
  370. int ib_init_ah_from_mcmember(struct ib_device *device, u8 port_num,
  371.                  struct ib_sa_mcmember_rec *rec,
  372.                  struct ib_ah_attr *ah_attr);
  373.  
  374. /**
  375.  * ib_init_ah_from_path - Initialize address handle attributes based on an SA
  376.  *   path record.
  377.  */
  378. int ib_init_ah_from_path(struct ib_device *device, u8 port_num,
  379.              struct ib_sa_path_rec *rec,
  380.              struct ib_ah_attr *ah_attr);
  381.  
  382. #endif /* IB_SA_H */
  383.